package com.roamer.audition.common.enums;

import com.roamer.audition.common.enums.base.BaseDbEnum;

import java.util.Optional;

/**
 * 面试结果枚举
 *
 * @author roamer
 * @version V1.0
 * @date 2019/8/24 9:46 下午
 */
public enum ResultEnum implements BaseDbEnum {
    /** 未通过 */
    FAILED((byte) 0, "未通过"),
    /** 通过 */
    PASS((byte) 1, "通过"),
    /** 未知 */
    UNKNOWN((byte) 2, "未知"),
    ;

    final Byte value;

    final String desc;

    ResultEnum(byte value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    /**
     * 是否存在
     *
     * @param value 对比{@link ResultEnum#value}
     *
     * @return {@code true} 存在返回true
     */
    public static boolean exist(Byte value) {
        if (null == value) {
            return false;
        }
        for (ResultEnum e : ResultEnum.values()) {
            if (e.value.equals(value)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取枚举实例
     *
     * @param value 对比{@link ResultEnum#value}
     *
     * @return {@code Optional<ResultEnum>}
     */
    public static Optional<ResultEnum> getOptionalEnumByValue(Byte value) {
        if (null == value) {
            return Optional.empty();
        }
        for (ResultEnum e : ResultEnum.values()) {
            if (e.value.equals(value)) {
                return Optional.of(e);
            }
        }
        return Optional.empty();
    }


    /**
     * 获取枚举实例
     *
     * @param value 对比{@link ResultEnum#value}
     *
     * @return {@code ResultEnum}
     */
    public static ResultEnum getEnumByValue(Byte value) {
        if (null == value) {
            return null;
        }
        for (ResultEnum e : ResultEnum.values()) {
            if (e.value.equals(value)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 获取枚举描述
     *
     * @param value 对比{@link ResultEnum#value}
     *
     * @return {@code Optional<String>}
     */
    public static Optional<String> getDescByValue(Byte value) {
        if (null == value) {
            return Optional.empty();
        }
        return getOptionalEnumByValue(value).map(ResultEnum::getDesc);
    }

    @Override
    public Byte getValue() {
        return value;
    }

    @Override
    public String getDesc() {
        return desc;
    }
}
